﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;

namespace DynaSpace.Menu
{
	/// <summary>
	/// Abstraktní třída reprezentuje položku v menu
	/// </summary>
	public abstract class MenuItem
	{
		/// <summary>
		/// Konstruktor <see cref="MenuItem"/>
		/// </summary>
		public MenuItem()
		{
			this.Height = 20;
			this.CanFocus = false;
			this.Visible = true;
		}

		/// <summary>
		/// Updatuje stav objektu
		/// </summary>
		/// <param name="upateTime">Čas hry</param>
		/// <param name="data">Informace o aktuálním focusu a menu</param>
		public abstract void Update(GameTime upateTime, MenuItemUpdateData data);

		/// <summary>
		/// Vykreslí ovládací prvek
		/// </summary>
		/// <param name="spriteBatch">Sprite batch pro vykreslování</param>
		/// <param name="position">Pozice vykreslování</param>
		/// <param name="data">Informace o aktuálním focusu a menu</param>
		public abstract void Draw(SpriteBatch spriteBatch, Vector2 position, MenuItemUpdateData data);

		/// <summary>
		/// Nastaví na tomto prvku focus
		/// </summary>
		/// <param name="menu">Menu, ve kterém je prvek umístěn</param>
		public void SetFocus(MenuContainer menu)
		{
			menu.MenuItemUpdateData.ItemWithFocus = this;
		}

		/// <summary>
		/// Vrací výšku ovládacího prvku v pixelech
		/// </summary>
		public virtual int Height
		{
			get;
			protected set;
		}

		/// <summary>
		/// Vrací, zda může objekt získat focus
		/// </summary>
		public virtual bool CanFocus
		{
			get;
			protected set;
		}

		/// <summary>
		/// Vrací, zda je objekt viditelný
		/// Na neviditelný objekt se nebere potaz při předávání focusu
		/// </summary>
		public virtual bool Visible
		{
			get;
			protected set;
		}

	}
}
